﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;

namespace Dashboard.Common
{
    /// <summary>
    /// 更改访问权限为：public
    /// 实现接口ICommand
    /// 填充接口定义的方法
    /// </summary>
    public class CommandBase : ICommand
    {
        /// <summary>
        /// 触发的事件对象（由ICommand接口提供）
        /// </summary>
        public event EventHandler CanExecuteChanged;

        /// <summary>
        /// 能否触发事件（由ICommand接口提供）
        /// </summary>
        /// <param name="parameter"></param>
        /// <returns></returns>
        public bool CanExecute(object parameter)
        {
            /// 如果DoCanExecute为空，则返回的也就是空，所以，最终返回类型是bool?
            bool? result = DoCanExecute?.Invoke(parameter);
            /// 因为函数希望对外返回的是bool而不是bool？，所以当result为true时返回true，为false和为null是都返回false
            return result == true;
        }
        /// <summary>
        /// 事件内部执行内容（由ICommand接口提供）
        /// </summary>
        /// <param name="parameter"></param>
        public void Execute(object parameter)
        {
            /// 问号后调用方法的语法逻辑是：当DoExecute不为空时才调用Invoke方法
            DoExecute?.Invoke(parameter);
        }

        /// <summary>
        /// 因为会触发本基础命令的操作有很多，为了代码重用，所以将所有的触发条件都作为一个委托，并定义在这里
        /// </summary>
        public Action<object> DoExecute { get; set; }
        /// <summary>
        /// 因为出发条件有很多，为了代码重用，所以定义一个方法用来返回触发条件是否为true，该方法由外部传入（这里实际上就是定义了一个函数类型的成员变量，由外部传入，内部通过该对象执行方法得到判断结果）
        /// </summary>
        public Func<object,bool> DoCanExecute { get; set; }
    }
}
